package com.crm.server.service.impl;

import cn.hutool.core.codec.Base64;
import cn.hutool.core.util.IdUtil;
import com.crm.server.config.CaptchaResponse;
import com.google.code.kaptcha.Producer;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.data.redis.core.RedisTemplate;
import org.springframework.stereotype.Service;
import javax.imageio.ImageIO;
import java.awt.image.BufferedImage;
import java.io.ByteArrayOutputStream;
import java.io.IOException;
import java.util.concurrent.TimeUnit;

/**
 * 验证码服务类（核心业务逻辑）
 * 负责：生成验证码图片、Base64编码、UUID关联存储、验证码校验
 */
@Service
public class CaptchaService {

    // 1. 注入验证码生成器（从KaptchaConfig中获取）
    @Autowired
    private Producer captchaProducer;

    // 2. 注入RedisTemplate（用于存储"UUID-验证码"键值对，过期时间10分钟，避免内存泄漏）
    @Autowired
    private RedisTemplate<String, String> redisTemplate;

    // 验证码过期时间（单位：分钟）
    private static final Integer CAPTCHA_EXPIRE_MINUTES = 10;

    // Base64图片前缀（前端可直接用于<img src="xxx">）
    private static final String BASE64_IMAGE_PREFIX = "data:image/jpeg;base64,";

    /**
     * 生成验证码（核心方法）
     * @return 包含Base64图片、UUID的响应实体
     */
    public CaptchaResponse generateCaptcha() {
        try {
            // 步骤1：生成随机验证码字符（如"8A3F"）
            String captchaCode = captchaProducer.createText();

            // 步骤2：生成验证码图片（BufferedImage对象）
            BufferedImage captchaImage = captchaProducer.createImage(captchaCode);

            // 步骤3：将图片转为Base64编码字符串
            ByteArrayOutputStream outputStream = new ByteArrayOutputStream();
            ImageIO.write(captchaImage, "jpeg", outputStream); // 以JPEG格式写入流
            byte[] imageBytes = outputStream.toByteArray();
            String base64Img =  Base64.encode(imageBytes); // 拼接Base64前缀
//            BASE64_IMAGE_PREFIX +

            // 步骤4：生成唯一UUID（用于关联当前验证码，后续校验用）
            String captchaUuid = IdUtil.simpleUUID(); // Hutool工具类生成短UUID（如"b7f2b3ccac8c4a9ba4f5f1d2224e382d"）

            // 步骤5：将"UUID-验证码"存入Redis，设置过期时间（10分钟）
            String redisKey = "captcha:" + captchaUuid; // 键前缀：避免与其他Redis键冲突
            redisTemplate.opsForValue().set(redisKey, captchaCode, CAPTCHA_EXPIRE_MINUTES, TimeUnit.MINUTES);

            // 步骤6：封装响应结果（与接口示例格式一致）
            return new CaptchaResponse("操作成功", base64Img, 200, captchaUuid);

        } catch (IOException e) {
            // 异常处理：生成失败时返回错误响应
            e.printStackTrace();
            return new CaptchaResponse("验证码生成失败", null, 500, null);
        }
    }

    /**
     * 校验验证码（后续登录/接口调用时使用）
     * @param captchaUuid 验证码唯一标识（前端传入）
     * @param userInputCode 用户输入的验证码（前端传入）
     * @return true=校验通过，false=校验失败（过期/不匹配）
     */
    public boolean validateCaptcha(String captchaUuid, String userInputCode) {
        // 步骤1：参数合法性校验
        if (captchaUuid == null || userInputCode == null || captchaUuid.isEmpty() || userInputCode.isEmpty()) {
            return false;
        }

        // 步骤2：从Redis获取存储的验证码
        String redisKey = "captcha:" + captchaUuid;
        String storedCode = redisTemplate.opsForValue().get(redisKey);

        // 步骤3：校验逻辑（1. 存储的验证码是否存在；2. 大小写不敏感匹配）
        if (storedCode == null) {
            return false; // 验证码已过期或不存在
        }
        boolean isMatch = storedCode.equalsIgnoreCase(userInputCode);

        // 步骤4：校验通过后删除Redis中的验证码（避免重复使用）
        if (isMatch) {
            redisTemplate.delete(redisKey);
        }

        return isMatch;
    }
}